package main

import (
	"fmt"
	"sync"
	"time"
)

// 制作原子操作的 int类型。注意： 系统是有 atomic 的原子操作的。atomic.AddInt32() 等，保证"线程安全",
// go中就是 在多个并发执行的 goroutine中 保证安全
type atomicInt struct {
	val int
	lock sync.Mutex
}

// 构建两个函数
func (a *atomicInt) increment() {
	// 用锁来保护起来
	a.lock.Lock()
	defer a.lock.Unlock()
	a.val++

}

func (a *atomicInt) get() int {
	// 加锁解锁
	a.lock.Lock()
	defer a.lock.Unlock()
	return a.val
}

func main() {
	var a atomicInt
	a.increment()
	go func() {
		a.increment()
	}()
	time.Sleep(time.Millisecond)
	fmt.Println(a.get())
}

// 每个操作加锁后， 就互斥锁后， 就不会出现 main() 和 新开的 goroutine 竞争了。
